// 前端api接口
const express = require('express');
const uploader = require('../middleware/uploader')
// 引入expressjwt 中间件
const expressJWT = require("express-jwt");
//用加密并生成token的模块
const jwt = require("jsonwebtoken");

const apiRouter = express.Router();
// 引入对应controller
const userController = require('../controllers/web/user');
const imgUpload = require('../controllers/web/img_upload');
const articleController = require('../controllers/web/comment');
const likeCollectController = require('../controllers/web/like_collection')
const secret = "sdfejkfeahf-XSWEIJFIE";
// 配置允许跨域
apiRouter.use(require('../middleware/cors'));
// 配置token 中间件 验证token 解密token
apiRouter.use(expressJWT({
   // 加密密钥
   secret: secret,
   // 加密算法 HS256 sha256hash
   // RS256 rsa公钥签名算法.要用ssh或ssl去生成一个公钥 xxxx.pub 和 私钥 xxxx.key 这是secret要引入密钥文件
   algorithms: ["HS256"],
   //是否强制，否则游客不验证
   credentialsRequired: true,
   // 重写获取token的方式
   getToken: (req) => {
      // console.log("token--------",req.headers);
      //判断请求头有没有token并截取Bearer
      if (req.headers.authorization && req.headers.authorization.split(" ")[0] == 'Bearer') {
         return req.headers.authorization.split(" ")[1];
      } else if (req.query.token) {
         //判断get传值里面有没有token
         return req.query.token;
      } else if (req.body.token) {
         return req.body.token;
      }
      return null; //
   }
}).unless({
   // 设置不需要token验证的路径
   path: ["/api/register",
      "/api/login",
      // "/api/user_info", 
      "/api/upload",
      "/api/article",
      "/api/all_article",
      "/api/user_article",
      "/api/like",
      "/api/likeNum",
      "/api/all_like_data",
      "/api/collect",
      "/api/all_collect",
      "/api/search",
   ]
}));
//自定义中间件来拦截token错误
apiRouter.use((error, req, response, next) => {
   // console.log("token信息==>", error.name);
   //当token验证失败时候 name==UnauthorizedError
   if (error.name == "UnauthorizedError") {
      if (error.inner && error.inner.name == "TokenExpiredError") {
         response.json({
            status: 401,
            message: "token过期"
         });
      } else {
         response.json({
            status: 401,
            message: "token 验证失败!"
         })
      }
   } else {
      next();
   }
});
// 自定义中间件，添加一个签名token的方法
apiRouter.use((req, response, next) => {
   req.sign = function (data) {
      // console.log('-----data------',data);
      return jwt.sign(data, secret, {
         expiresIn: "7 d", //2天 token有效期
         algorithm: "HS256"
      })
   }
   next();
});
// 登录api
apiRouter.post("/login", userController.login);
// 注册api
apiRouter.post("/register", userController.register);
//获取用户信息
apiRouter.post('/user_info', userController.userinfo)
// 上传图片
apiRouter.post('/upload', uploader.single('filename'), imgUpload.imgUp);
// 发表文章
apiRouter.post('/article', articleController.postArticle)
// 获取所有文章数据 倒叙
apiRouter.post('/all_article', articleController.allArticle)
// 获取当前用户发表的文章   倒叙
apiRouter.post('/user_article', articleController.userArticle)
// 喜欢
apiRouter.post('/like', likeCollectController.like)
// 获取点赞总数 u_id
apiRouter.post('/likeNum', likeCollectController.likeNums)
// 获取点赞总数据  倒叙
apiRouter.post('/all_like_data', likeCollectController.AllLike)
// 收藏
apiRouter.post('/collect', likeCollectController.collect)
// 收藏总数  倒叙
apiRouter.post('/all_collect', likeCollectController.AllCollect)
// 根据关键词搜索
apiRouter.post('/search',articleController.searchArticle)
// 导出
module.exports = apiRouter;